Python检测生僻字的实现方法 您所在的位置:网站首页 gb2312 生僻字 Python检测生僻字的实现方法

Python检测生僻字的实现方法

#Python检测生僻字的实现方法| 来源: 网络整理| 查看: 265

解决思路

首先想到的就是利用 python 的正则表达式来匹配非法字符,然后找出非法记录。然而理想总是丰满的,现实却是残酷的。在实现的过程中,才发现自己对于字符编码、以及 python 内部字符串表示的相关知识的缺乏。在这期间,踩过了不少坑,到最后虽然还有些模糊的地方,但总算有一个总体清晰的了解。在此记录下心得,避免以后在同一个地方跌倒。

以下的测试环境是 ArcGIS 10.3 自带的 python 2.7.8 环境,不保证其他 python 环境也适用。

python 正则表达式

python 中的正则功能由内嵌的 re 函数库提供,主要用到 3 个函数。re.compile() 提供可重用的正则表达式,match() 和 search() 函数返回匹配结果,两者之间的区别在于: match() 从指定位置开始匹配,search() 会从指定位置向后搜索直到找到匹配字符串。例如下面的代码中,match_result 从第一个字符 f 开始匹配,匹配失败返回空值;search_result 从 f 开始向后搜索,直到找到第一个匹配的字符 a, 然后通过 group() 函数输出匹配结果为字符 a。

import re pattern = re.compile('[abc]') match_result = pattern.match('fabc') if match_result: print match_result.group() search_result = pattern.search('fabc') if search_result: print search_result.group()登录后复制

以上的实现方式需要先编译一个 pattern,然后再进行匹配。实际上,我们可以直接利用 re.match(pattern, string) 函数来实现相同的功能。但是直接匹配的方式没有先编译再匹配的方式灵活,首先是正则表达式没办法重用,如果大量数据进行同一模式匹配,意味着每次都需要内部编译,造成性能损失;另外,re.match() 函数没有 pattern.match() 功能强大,后者可以指定从哪个位置开始匹配。

编码问题

了解 python 正则的基本功能后,剩下的事情就是找到一个合适的正则表达式来匹配生僻字和非法字符。非法字符很简单,采用以下 pattern 就可以实现匹配:

pattern = re.compile(r'[~!@#$%^&* ]')登录后复制

然而对于生僻字的匹配,着实难倒了我。首先是对于生僻字的定义,什么样的字算生僻字?经过咨询项目经理,规定非 GB2312 的字符属于生僻字。接下来的问题是,如何匹配 GB2312 字符?

经过查询,GB2312 的范围是 [\xA1-\xF7][\xA1-\xFE] ,其中汉字区的范围是 [\xB0-\xF7][\xA1-\xFE] 。因此,添加生僻字匹配后的表达式为:

pattern = re.compile(r'[~!@#$%^&* ]|[^\xA1-\xF7][^\xA1-\xFE]')登录后复制

问题似乎是顺理得当地解决了,然而我还是 too simple too naive 。由于要判断的字符串都是从图层文件读取的,arcpy 贴心地将读取的字符编码为 unicode 格式。因此,我需要找出 GB2312 字符集在 unicode 中的编码范围。但现实是,GB2312 字符集在 unicode 中的分布并不是连续的,使用正则表示这个范围必定是非常复杂的。使用正则表达式匹配生僻字的构想,似乎陷入了死胡同。

解决方案

既然提供的字符串是 unicode 格式,那么我可不可以将其转换为 GB2312 再进行匹配呢?实际上是不行,因为 unicode 字符集要远大于 GB2312 字符集,因此 GB2312 => unicode 总是可以实现的,而反过来 unicode => GB2312 不一定能成功。

这突然为我提供了另外一种思路,假设一个字符串的 unicode => GB2312 转换会失败,那么是不是恰恰说明了它不属于 GB2312 字符集?所以,我使用 unicode_string.encode('GB2312') 函数尝试转换字符串,捕获 UnicodeEncodeError 异常来识别生僻字。

最终的代码如下:

import re def is_rare_name(string): pattern = re.compile(u"[~!@#$%^&* ]") match = pattern.search(string) if match: return True try: string.encode("gb2312") except UnicodeEncodeError: return True return False登录后复制

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

微信分享

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系[email protected]核实处理。

相关标签:python 生僻字 python 检测编码 python检测字符串编码上一篇:python类中super()和__init__()的区别下一篇:python使用str & repr转换字符串

相关文章

相关视频

python发腾讯微博代码分享编写自定义的Django模板加载器的简单示例python实现2014火车票查询代码分享Python类的基础入门知识Python检测生僻字的实现方法Python 简介Python 环境搭建Python 中文编码Python 基础语法Python 变量类型视频教程分类php视频教程html视频教程css视频教程JS视频教程jQuery视频教程mysql视频教程Linux视频教程Python视频教程Laravel视频教程Vue视频教程专题推荐独孤九贱-php全栈开发教程

全栈 170W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

玉女心经-web前端开发教程

入门 80W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

天龙八部-实战开发教程

实战 120W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

作者信息

php中文网

认证0级讲师

最新文章热门排行

php中文网为您推荐几个好用的源码python怎么重命名文件python支持的操作系统有哪些python多行注释符号是什么python是什么类型的编程语言一文看懂Python爬虫isinstance在python中是什么意思python中“+=”是什么意思python怎么保留两位小数

python是什么意思py文件怎么打开?python中format怎么用python中eval是什么意思?python如何读取txt文件内容python中str是什么意思pycharm怎么安装python怎么变成中文版推荐视频教程PHP直播课相关教程热门推荐最新课程独孤九贱(3)_JavaScript视频教程独孤九贱(3)_JavaScript视频教程

308241次学习

收藏独孤九贱(6)_jQuery视频教程独孤九贱(6)_jQuery视频教程

304885次学习

收藏php8,我来也php8,我来也

342528次学习

收藏最懂你的大前端课:HTML5/CSS3/ES6/NPM/Vue/...【原创】最懂你的大前端课:HTML5/CSS3/ES6/NPM/Vue/...【原创】

66556次学习

收藏Thinkphp6.0正式版视频教程Thinkphp6.0正式版视频教程

366536次学习

收藏最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)最新ThinkPHP 5.1全球首发视频教程(60天成就PHP大牛线上培训班课)

1291636次学习

收藏phpStudy极速入门视频教程phpStudy极速入门视频教程

502859次学习

收藏独孤九贱(4)_PHP视频教程独孤九贱(4)_PHP视频教程

1134133次学习

收藏PHP实战天龙八部之仿爱奇艺电影网站PHP实战天龙八部之仿爱奇艺电影网站

701753次学习

收藏独孤九贱(1)_HTML5视频教程独孤九贱(1)_HTML5视频教程

571563次学习

收藏公益直播:PHP8,究竟有啥野心..!?公益直播:PHP8,究竟有啥野心..!?

372次学习

收藏Linux运维基础课程【全程干货详解】Linux运维基础课程【全程干货详解】

2892次学习

收藏Symfony5【从0开始开发博客系统】Symfony5【从0开始开发博客系统】

7143次学习

收藏Vue.js 2.0 从入门到实战Vue.js 2.0 从入门到实战

14339次学习

收藏Laravel 8 课程精讲(台湾同胞版)Laravel 8 课程精讲(台湾同胞版)

3334次学习

收藏


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有